package com.jrauto.CarAppBackend.utils;

/**
 * @author : huiMing
 * Date : 2025年09月03日 17:28
 * @version V1.0
 */

import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * WebSocket 消息处理器
 * 使用 @Component 注解使其成为一个 Spring Bean，可以被注入到其他类中
 */
@Component
public class ChatWebSocketHandler extends TextWebSocketHandler {

    // 存储在线用户会话的Map，键为用户ID，值为WebSocketSession
    private final Map<Integer, WebSocketSession> users = new ConcurrentHashMap<>();

    /**
     * 建立连接后调用
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        // 从会话URI或请求参数中获取用户ID
        // 注意：这种方式仅为示例，实际项目中应使用更安全的认证方式（如 JWT）来获取用户身份信息
        Integer userId = getUserIdFromSession(session);
        if (userId != null) {
            users.put(userId, session);
            System.out.println("用户 " + userId + " 已连接");
        }
    }

    /**
     * 接收到消息时调用
     */
    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 这里的逻辑可以根据业务需要来处理，例如接收到消息后广播
        System.out.println("接收到消息：" + message.getPayload());
        // 示例：将消息广播给所有在线用户
        for (WebSocketSession s : users.values()) {
            s.sendMessage(message);
        }
    }

    /**
     * 发送消息给指定用户
     * @param userId 目标用户ID
     * @param message 消息内容
     */
    public void sendMessageToUser(Integer userId, String message) {
        WebSocketSession session = users.get(userId);
        if (session != null && session.isOpen()) {
            try {
                session.sendMessage(new TextMessage(message));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 连接关闭时调用
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, org.springframework.web.socket.CloseStatus status) throws Exception {
        Integer userId = getUserIdFromSession(session);
        if (userId != null) {
            users.remove(userId);
            System.out.println("用户 " + userId + " 已断开连接");
        }
    }

    /**
     * 从 WebSocketSession 中解析用户ID
     * 实际应用中需要根据您的认证方式来获取
     */
    private Integer getUserIdFromSession(WebSocketSession session) {
        // 示例：从路径中获取用户ID，例如 /websocket/chat/123
        String uri = session.getUri().toString();
        // 简单的正则表达式解析
        try {
            return Integer.parseInt(uri.substring(uri.lastIndexOf("/") + 1));
        } catch (NumberFormatException e) {
            return null;
        }
    }
}
